Parameterized Tests হল GoogleTest এর একটি শক্তিশালী ফিচার, যা আপনাকে একটি একক টেস্ট কেসের মধ্যে বিভিন্ন ইনপুটের সাথে একাধিক টেস্ট চালানোর সুবিধা দেয়। এটি পুনরাবৃত্তি এবং কোড ডুপ্লিকেশন কমাতে সহায়ক, বিশেষত যখন একই পরীক্ষার লজিক বিভিন্ন ইনপুটের জন্য পরীক্ষা করতে হয়।
কেন Parameterized Tests ব্যবহার করবেন?
- কোড পুনঃব্যবহারযোগ্যতা: একই টেস্ট কেসের মধ্যে বিভিন্ন ইনপুট ব্যবহার করে কোডকে আরো কার্যকরী ও পরিষ্কার করা।
- সহজ রক্ষণাবেক্ষণ: ইনপুটগুলির পরিবর্তন হলে কোডের অন্য অংশে পরিবর্তন করার প্রয়োজন নেই।
- নতুন কেসের দ্রুত সংযোজন: নতুন ইনপুট কেস যুক্ত করা সহজ।
Parameterized Tests তৈরি করা
GoogleTest এ Parameterized Tests তৈরি করতে INSTANTIATE_TEST_SUITE_P এবং TEST_P ম্যাক্রো ব্যবহার করা হয়।
উদাহরণ:
#include <gtest/gtest.h>
// একটি টেস্ট ফিক্সচার তৈরি
class MyTestFixture : public ::testing::TestWithParam<int> {
protected:
// Setup কোড (যদি প্রয়োজন হয়)
void SetUp() override {
// কিছু প্রস্তুতি (যদি প্রয়োজন হয়)
}
};
// Parameterized Test case
TEST_P(MyTestFixture, TestMultiplication) {
int input = GetParam(); // প্যারামিটার ইনপুট পাওয়া
EXPECT_EQ(input * 2, input + input); // টেস্ট লজিক
}
// Parameterized test cases এর ইনস্ট্যান্স তৈরি
INSTANTIATE_TEST_SUITE_P(
MultiplicationTests,
MyTestFixture,
::testing::Values(1, 2, 3, 4, 5) // ইনপুট ভ্যালু
);
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS(); // সমস্ত টেস্ট চালানো
}
ব্যাখ্যা:
- TestWithParam:
MyTestFixtureক্লাসটি::testing::TestWithParam<int>থেকে উত্তরাধিকারী, যেখানেintহল ইনপুট টাইপ। - GetParam():
GetParam()মেথড ব্যবহার করে টেস্ট কেসের জন্য প্যারামিটার ইনপুট পাওয়া যায়। - INSTANTIATE_TEST_SUITE_P: এই ম্যাক্রো ব্যবহার করে বিভিন্ন ইনপুট ভ্যালু সহ টেস্ট কেসের ইনস্ট্যান্স তৈরি করা হয়। এখানে, 1, 2, 3, 4, এবং 5 হল প্যারামিটার ইনপুট।
সুবিধা
- একাধিক ইনপুটের জন্য একই টেস্ট কেস চালানো।
- ডুপ্লিকেট কোড কমিয়ে আনা।
- সহজে নতুন ইনপুট যুক্ত করা।
সারসংক্ষেপ
Parameterized Tests GoogleTest এর একটি শক্তিশালী বৈশিষ্ট্য, যা একক টেস্ট কেসের মধ্যে বিভিন্ন ইনপুট পরীক্ষা করতে সহায়ক। এটি কোডের পুনঃব্যবহারযোগ্যতা বাড়ায় এবং টেস্ট লেখার সময় ডুপ্লিকেশন হ্রাস করে। GoogleTest ব্যবহার করে Parameterized Tests তৈরি করা সহজ এবং কার্যকর।
Parameterized Test হল একটি পরীক্ষার পদ্ধতি যেখানে একটি টেস্ট কেস একাধিক সেটের ইনপুট বা প্যারামিটার ব্যবহার করে একাধিকবার চালানো হয়। এটি টেস্ট কেসের অভ্যন্তরে বিভিন্ন ইনপুটের জন্য একই টেস্ট লজিক প্রয়োগ করতে সহায়ক। এই পদ্ধতির মাধ্যমে একাধিক পরিস্থিতি এবং শর্তগুলির পরীক্ষা করা যায়, যা টেস্টিং প্রক্রিয়াকে আরও কার্যকরী এবং সাশ্রয়ী করে।
Parameterized Test-এর মূল উপাদানগুলি:
ইনপুট প্যারামিটার: টেস্ট কেসের জন্য বিভিন্ন ইনপুট বা প্যারামিটার নির্ধারণ করা হয়। এটি সাধারণত একটি তালিকা বা অ্যারে হিসেবে থাকে।
টেস্ট কেসের লজিক: একটি সাধারণ টেস্ট কেস লেখা হয়, যা বিভিন্ন ইনপুটের উপর ভিত্তি করে একাধিকবার চালানো হয়।
টেস্টের ফলাফল: প্রত্যাশিত ফলাফলগুলি নির্ধারণ করা হয়, যা প্রতিটি ইনপুটের জন্য যাচাই করা হয়।
উদাহরণ: GoogleTest-এ Parameterized Test
#include <gtest/gtest.h>
// A sample function to test
int add(int a, int b) {
return a + b;
}
// Parameterized Test
class AddTest : public ::testing::TestWithParam<std::tuple<int, int, int>> {};
TEST_P(AddTest, HandlesVariousInputs) {
int a = std::get<0>(GetParam());
int b = std::get<1>(GetParam());
int expected = std::get<2>(GetParam());
EXPECT_EQ(add(a, b), expected);
}
// Defining the parameters
INSTANTIATE_TEST_SUITE_P(AdditionTests, AddTest,
::testing::Values(
std::make_tuple(1, 2, 3),
std::make_tuple(2, 3, 5),
std::make_tuple(-1, 1, 0),
std::make_tuple(0, 0, 0)
));
Parameterized Test-এর প্রয়োজনীয়তা
ডুপ্লিকেট কোডের অভাব: Parameterized Test ব্যবহার করে টেস্টের কোড ডুপ্লিকেট হওয়া কমে যায়। একই লজিক ব্যবহার করে বিভিন্ন ইনপুটের জন্য পৃথক টেস্ট কেস তৈরি করার প্রয়োজন নেই।
টেস্টের পরিসর বৃদ্ধি: বিভিন্ন ইনপুটের জন্য একই টেস্ট কেস চালিয়ে, আপনি কোডের কার্যকারিতা বিভিন্ন পরিস্থিতিতে পরীক্ষা করতে পারেন।
ডিবাগিং সহজ: যখন একটি Parameterized Test ব্যর্থ হয়, তখন আপনি দ্রুত চিহ্নিত করতে পারেন কোন ইনপুট বা প্যারামিটার সমস্যা সৃষ্টি করছে।
সহজ রক্ষণাবেক্ষণ: নতুন প্যারামিটার যুক্ত করা বা বিদ্যমান প্যারামিটার পরিবর্তন করা সহজ। এটি টেস্ট কেসের পরিবর্তন প্রক্রিয়াকে সহজ করে।
ফলাফলের বিশ্লেষণ: একাধিক ইনপুটের জন্য ফলাফল বিশ্লেষণ করা সহজ, কারণ সব কিছু একটি টেস্ট কেসের অধীনে সংগৃহীত হয়।
উপসংহার
Parameterized Test একটি কার্যকরী টেস্টিং কৌশল যা কোডের বিভিন্ন পরিস্থিতি পরীক্ষা করার সুযোগ দেয়। এটি টেস্টিং প্রক্রিয়াকে সোজা করে এবং কোডের গুণমান নিশ্চিত করতে সহায়ক। উপযুক্তভাবে ব্যবহার করা হলে, Parameterized Tests প্রকল্পের পরীক্ষার কাঠামোকে আরও শক্তিশালী ও কার্যকর করে তোলে।
GoogleTest-এ Value Parameterized Tests এবং Typed Tests হল দুইটি শক্তিশালী বৈশিষ্ট্য, যা আপনাকে আপনার টেস্ট কেসগুলিকে আরও কার্যকরী এবং পুনরায় ব্যবহারযোগ্য করতে সহায়ক। নিচে এই দুটি পরীক্ষার প্রকার এবং তাদের ব্যবহারের পদ্ধতি আলোচনা করা হলো।
১. Value Parameterized Tests
Value Parameterized Tests হল এমন টেস্টগুলি যা একাধিক মানের জন্য একাধিক পরীক্ষার সেট তৈরি করে। এটি বিশেষভাবে ব্যবহারকারীকে বিভিন্ন ইনপুটের জন্য একই টেস্ট লজিক পুনরায় চালাতে দেয়।
ব্যবহারের পদ্ধতি:
- TEST_P ম্যাক্রো ব্যবহার করে প্যারামিটারাইজড টেস্ট তৈরি করুন।
- INSTANTIATE_TEST_SUITE_P ম্যাক্রো ব্যবহার করে বিভিন্ন ইনপুটের জন্য টেস্ট কেসগুলি ইনস্ট্যানশিয়েট করুন।
উদাহরণ:
#include <gtest/gtest.h>
// প্যারামিটারাইজড টেস্টের জন্য Fixture তৈরি করুন
class MyParamTest : public ::testing::TestWithParam<int> {};
// প্যারামিটারাইজড টেস্ট
TEST_P(MyParamTest, TestIsEven) {
int n = GetParam();
ASSERT_TRUE(n % 2 == 0); // পরীক্ষাটি নিশ্চিত করে যে n জোড় সংখ্যা
}
// ইনস্ট্যানশিয়েট প্যারামিটারগুলির জন্য টেস্ট
INSTANTIATE_TEST_SUITE_P(EvenNumbers, MyParamTest, ::testing::Values(2, 4, 6, 8, 10));
২. Typed Tests
Typed Tests হল এমন টেস্টগুলি যা একটি নির্দিষ্ট টাইপের জন্য টেস্ট কেসগুলি তৈরি করে। এটি একই টেস্ট লজিককে বিভিন্ন টাইপের জন্য পুনরায় ব্যবহার করতে সক্ষম করে।
ব্যবহারের পদ্ধতি:
- TYPED_TEST এবং TYPED_TEST_SUITE ম্যাক্রো ব্যবহার করে টেস্টগুলি তৈরি করুন।
- INSTANTIATE_TYPED_TEST_SUITE_P ব্যবহার করে টাইপের ইনস্ট্যানশিয়েশন করুন।
উদাহরণ:
#include <gtest/gtest.h>
// টাইপের জন্য Fixture তৈরি করুন
template <typename T>
class MyTypedTest : public ::testing::Test {};
// টাইপগুলি ডিফাইন করা
using MyTypes = ::testing::Types<int, float, double>;
TYPED_TEST_SUITE(MyTypedTest, MyTypes);
// টাইপের জন্য টেস্ট
TYPED_TEST(MyTypedTest, TestIsPositive) {
TypeParam value = 1.0; // উদাহরণস্বরূপ 1.0 এর ইনিশিয়ালাইজেশন
ASSERT_GT(value, 0); // নিশ্চিত করে যে value পজিটিভ
}
সারাংশ
- Value Parameterized Tests: একাধিক মানের জন্য একই টেস্ট লজিক পুনরায় চালাতে ব্যবহৃত হয়।
- Typed Tests: বিভিন্ন টাইপের জন্য একই টেস্ট লজিক ব্যবহার করতে সাহায্য করে।
উপসংহার
Value Parameterized Tests এবং Typed Tests হল GoogleTest-এর গুরুত্বপূর্ণ বৈশিষ্ট্য, যা আপনার টেস্টিং প্রক্রিয়াকে আরও কার্যকরী এবং পুনরায় ব্যবহারযোগ্য করে। এই বৈশিষ্ট্যগুলি ব্যবহার করে, আপনি আপনার টেস্ট কেসগুলি সহজেই প্রসারিত এবং বজায় রাখতে পারবেন, যা কোডের গুণমান উন্নত করতে সহায়ক।
Test Data যুক্ত করা এবং পুনরায় ব্যবহার করা টেস্টিং প্রক্রিয়াকে সহজ ও কার্যকরী করার জন্য গুরুত্বপূর্ণ। সঠিকভাবে তৈরি এবং সংরক্ষিত টেস্ট ডেটা টেস্টিংয়ের সময় সুবিধা এবং কর্মক্ষমতা বৃদ্ধি করতে সহায়ক হতে পারে। নিচে কিছু পদ্ধতি আলোচনা করা হলো যার মাধ্যমে আপনি আপনার টেস্ট ডেটা সহজে যোগ এবং পুনরায় ব্যবহার করতে পারেন।
১. টেস্ট ডেটা ফাইল তৈরি করা
একটি টেস্ট ডেটা ফাইল তৈরি করুন যা JSON, CSV, বা Excel ফরম্যাটে হতে পারে। এটি বিভিন্ন টেস্টের জন্য ডেটা সংগ্রহের একটি সহজ উপায়।
উদাহরণ: JSON ফাইল
[
{
"input": [1.0, 2.0, 3.0],
"expected": 6.0
},
{
"input": [4.0, 5.0, 6.0],
"expected": 15.0
}
]
২. টেস্ট ডেটা লোড করা
একটি ফাংশন তৈরি করুন যা টেস্ট ডেটা ফাইলটি লোড করে এবং ব্যবহারযোগ্য ফরম্যাটে রূপান্তর করে।
উদাহরণ: Python ব্যবহার করে JSON ডেটা লোড করা
import json
def load_test_data(file_path):
with open(fileas f:
return json.load(f)
test_data = load_test_data('test_data.json')
৩. টেস্ট কেসে ডেটা ব্যবহার করা
টেস্ট কেসগুলিতে লোড করা টেস্ট ডেটা ব্যবহার করুন। GoogleTest বা অন্য টেস্টিং ফ্রেমওয়ার্কের মধ্যে এটি সহজে বাস্তবায়ন করা যায়।
উদাহরণ: GoogleTest ব্যবহার করে
#include <gtest/gtest.h>
#include <fstream>
#include <json/json.h> // JSON লাইব্রেরি
class TestData {
public:
std::vector<std::pair<std::vector<double>, double>> loadTestData(const std::string& filename) {
std::vector<std::pair<std::vector<double>, double>> data;
std::ifstream file(filename);
Json::Value jsonData;
file >> jsonData;
for (const auto& item : jsonData) {
std::vector<double> input = item["input"].asDouble();
double expected = item["expected"].asDouble();
data.emplace_back(input, expected);
}
return data;
}
};
TEST(MyTestSuite, DataDrivenTest) {
TestData testData;
auto data = testData.loadTestData("test_data.json");
for (const auto& item : data) {
const auto& input = item.first;
double expected = item.second;
// আপনার পরীক্ষার ফাংশন ব্যবহার করে ফলাফল যাচাই করুন
EXPECT_EQ(myFunction(input), expected);
}
}
৪. টেস্ট ডেটা তৈরি করার জন্য ফাংশন
আপনি অটোমেটেড টেস্ট ডেটা তৈরি করার জন্য ফাংশন তৈরি করতে পারেন, যা একাধিক টেস্ট কেসের জন্য ডেটা তৈরি করবে।
উদাহরণ: Python ব্যবহার করে
def generate_test_data(num_samples):
test_data = []
for _ in range(num_samples):
input_data = [random.uniform(1, 10) for _ in range(3)] # 3টি র্যান্ডম ইনপুট
expected_output = sum(input_data) # উদাহরণস্বরূপ, ইনপুটের যোগফল
test_data.append({"input": input_data, "expected": expected_output})
return test_data
# টেস্ট ডেটা তৈরি করুন
data = generate_test_data(10)
৫. টেস্ট ডেটার পুনঃব্যবহার
একবার টেস্ট ডেটা তৈরি হলে, আপনি সেটি পুনঃব্যবহার করতে পারেন। আপনার টেস্ট ফাইলের মধ্যে load_test_data ফাংশন ব্যবহার করে বিভিন্ন টেস্ট কেসে একই ডেটা লোড করতে পারেন।
উপসংহার
টেস্ট ডেটা সহজে যোগ করা এবং পুনঃব্যবহার করা মেশিন লার্নিং এবং সফটওয়্যার ডেভেলপমেন্টের প্রক্রিয়ায় একটি গুরুত্বপূর্ণ পদক্ষেপ। উপরে উল্লেখিত পদ্ধতিগুলি ব্যবহার করে আপনি আপনার টেস্টিং প্রক্রিয়াকে আরও দক্ষ এবং কার্যকরী করতে পারেন। JSON, CSV ইত্যাদি ফরম্যাটে ডেটা সংরক্ষণ করে এবং প্রোগ্রামে তা লোড করে আপনাকে উন্নত টেস্টিং ফলাফল এবং কোডের গুণমান নিশ্চিত করতে সহায়ক হবে।
GoogleTest-এ Parameterized Tests হল একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে একই টেস্ট কেসের জন্য বিভিন্ন ইনপুট ডেটা দিয়ে একাধিক টেস্ট চালাতে দেয়। এটি টেস্টের পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে এবং বিভিন্ন কন্ডিশনের অধীনে কোডের কার্যকারিতা পরীক্ষা করতে সহায়ক।
নিচে একটি উদাহরণের মাধ্যমে GoogleTest-এ Parameterized Test লেখার প্রক্রিয়া দেখানো হলো।
উদাহরণ: Parameterized Test তৈরি করা
আমরা একটি Calculator ক্লাস তৈরি করবো, যা মৌলিক গাণিতিক অপারেশন (যোগ, বিয়োগ) সম্পন্ন করবে। তারপর আমরা এই ক্লাসের জন্য Parameterized Test লিখবো।
ধাপ ১: Calculator ক্লাস তৈরি করা
প্রথমে একটি Calculator ক্লাস তৈরি করা যাক।
// calculator.h
#ifndef CALCULATOR_H
#define CALCULATOR_H
class Calculator {
public:
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
};
#endif
ধাপ ২: Parameterized Test লেখা
এখন আমরা GoogleTest ব্যবহার করে Parameterized Test লিখবো।
// main.cpp
#include <gtest/gtest.h>
#include "calculator.h"
// Parameterized test case for addition
class CalculatorAddTest : public ::testing::TestWithParam<std::tuple<int, int, int>> {
};
TEST_P(CalculatorAddTest, AddTest) {
Calculator calc;
int a = std::get<0>(GetParam());
int b = std::get<1>(GetParam());
int expected = std::get<2>(GetParam());
EXPECT_EQ(calc.add(a, b), expected);
}
// Parameterized test case for subtraction
class CalculatorSubtractTest : public ::testing::TestWithParam<std::tuple<int, int, int>> {
};
TEST_P(CalculatorSubtractTest, SubtractTest) {
Calculator calc;
int a = std::get<0>(GetParam());
int b = std::get<1>(GetParam());
int expected = std::get<2>(GetParam());
EXPECT_EQ(calc.subtract(a, b), expected);
}
// Test values for addition
INSTANTIATE_TEST_SUITE_P(AdditionTests, CalculatorAddTest,
::testing::Values(
std::make_tuple(1, 2, 3),
std::make_tuple(-1, 1, 0),
std::make_tuple(100, 200, 300)
));
// Test values for subtraction
INSTANTIATE_TEST_SUITE_P(SubtractionTests, CalculatorSubtractTest,
::testing::Values(
std::make_tuple(5, 3, 2),
std::make_tuple(10, 10, 0),
std::make_tuple(0, 1, -1)
));
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
কোড ব্যাখ্যা
Parameterized Test Definition:
CalculatorAddTestএবংCalculatorSubtractTestক্লাস দুটি Parameterized Test ক্লাস হিসাবে সংজ্ঞায়িত করা হয়েছে।::testing::TestWithParam<std::tuple<int, int, int>>ব্যবহার করা হয়েছে যাতে তিনটি ইনপুট (দুইটি সংখ্যা এবং একটি প্রত্যাশিত ফলাফল) পাঠানো যায়।
Test Cases:
TEST_Pম্যাক্রো ব্যবহার করেAddTestএবংSubtractTestফাংশন দুটি তৈরি করা হয়েছে। এখানেGetParam()ফাংশনটি ব্যবহার করে টেস্টের ইনপুটগুলি পাওয়া যায়।
Test Values Initialization:
INSTANTIATE_TEST_SUITE_Pম্যাক্রো ব্যবহার করেAdditionTestsএবংSubtractionTestsনামক ইনস্ট্যান্স তৈরি করা হয়েছে। এখানে বিভিন্ন ইনপুট এবং প্রত্যাশিত ফলাফলগুলির জন্য টেস্ট কেস সংজ্ঞায়িত করা হয়েছে।
ধাপ ৩: প্রকল্প কম্পাইল করা
এখন আপনি আপনার কোডটি কম্পাইল করুন:
bash
Copy code
g++ -o calculator_test main.cpp -lgtest -lpthread
ধাপ ৪: টেস্ট চালানো
এখন আপনি তৈরি করা টেস্টটি চালাতে পারেন:
bash
Copy code
./calculator_test
আউটপুট
আপনার টেস্টগুলো চালানোর পরে আউটপুট দেখতে পাবেন:
[==========] Running 6 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 3 tests from AdditionTests
[ RUN ] AdditionTests.AddTest
[ OK ] AdditionTests.AddTest (0 ms)
[ RUN ] AdditionTests.AddTest
[ OK ] AdditionTests.AddTest (0 ms)
[ RUN ] AdditionTests.AddTest
[ OK ] AdditionTests.AddTest (0 ms)
[----------] 3 tests from AdditionTests (3 passed)
[----------] 3 tests from SubtractionTests
[ RUN ] SubtractionTests.SubtractTest
[ OK ] SubtractionTests.SubtractTest (0 ms)
[ RUN ] SubtractionTests.SubtractTest
[ OK ] SubtractionTests.SubtractTest (0 ms)
[ RUN ] SubtractionTests.SubtractTest
[ OK ] SubtractionTests.SubtractTest (0 ms)
[----------] 3 tests from SubtractionTests (3 passed)
[==========] 6 tests from 2 test suites.
[ PASSED ] 6 tests.
সারসংক্ষেপ
এভাবে, আমরা GoogleTest ব্যবহার করে একটি Parameterized Test Suite তৈরি করেছি যা একটি Calculator ক্লাসের জন্য বিভিন্ন গাণিতিক অপারেশন পরীক্ষা করে। Parameterized Tests বিভিন্ন ইনপুটের জন্য একই টেস্ট কেস ব্যবহার করার মাধ্যমে কোডের কার্যকারিতা নিশ্চিত করতে সহায়ক।
এটি বিশেষ করে সুবিধাজনক যখন একাধিক ইনপুটের জন্য ফলাফল যাচাই করার প্রয়োজন হয়, যা টেস্টিংয়ের দক্ষতা এবং কার্যকারিতা বাড়ায়।
Read more